package com.winshare.saleAssistant.service.impl;

import com.winshare.saleAssistant.dao.ProductModuleMapper;
import com.winshare.saleAssistant.domain.entity.ProductModuleDO;
import com.winshare.saleAssistant.domain.query.ProductModuleQuery;
import com.winshare.saleAssistant.domain.dto.req.*;
import com.winshare.saleAssistant.domain.dto.resp.ProductModuleRespDTO;
import com.winshare.saleAssistant.exception.BusinessException;
import com.winshare.saleAssistant.mapper.ProductModuleMapStruct;
import com.winshare.saleAssistant.service.ProductModuleService;
import com.winshare.saleAssistant.util.Page;
import com.winshare.saleAssistant.util.RequestHolder;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Service
public class ProductModuleServiceImpl implements ProductModuleService {

    private final ProductModuleMapper productModuleMapper;

    public ProductModuleServiceImpl(ProductModuleMapper productModuleMapper) {
        this.productModuleMapper = productModuleMapper;
    }

    @Override
    public void save(ProductModuleCreateDTO productModuleCreateDTO) {
        ProductModuleDO productModuleDO = ProductModuleMapStruct.INSTANCE
                .fromProductModuleCreateDTO(productModuleCreateDTO);
        if(checkProductCategoryModuleExist(productModuleDO)) {
            throw new BusinessException("相同产品分类下面只能有一个相同的栏目名称");
        }
        productModuleDO.setCreator(RequestHolder.getCurrentUser().getStaffName());
        productModuleDO.setCreateTime(LocalDateTime.now().toString());
        productModuleMapper.saveProductModule(productModuleDO);
    }

    @Override
    public void update(ProductModuleUpdateDTO productModuleUpdateDTO) {
        ProductModuleDO productModuleDO = ProductModuleMapStruct.INSTANCE
                .fromProductModuleUpdateDTO(productModuleUpdateDTO);
        if(checkProductCategoryModuleExist(productModuleDO)) {
            throw new BusinessException("相同产品分类下面只能有一个相同的栏目名称");
        }
        productModuleMapper.updateProductModule(productModuleDO);
    }

    @Override
    public void delete(ProductModuleIdDTO productModuleIdDTO) {
        ProductModuleDO productModuleDO = ProductModuleMapStruct.INSTANCE.fromProductModuleIdDTO(productModuleIdDTO);
        productModuleMapper.deleteProductModule(productModuleDO);
    }

    @Override
    public void updateProductModuleSort(ProductModuleSortDTO productModuleSortDTO) {
        ProductModuleDO productModuleDO = ProductModuleMapStruct.INSTANCE
                .fromProductModuleSortDTO(productModuleSortDTO);
        productModuleMapper.updateProductModule(productModuleDO);
    }

    @Override
    public Page<ProductModuleRespDTO> getProductModuleList(ProductModuleQueryDTO productModuleQueryDTO) {
        ProductModuleQuery productModuleQuery = ProductModuleMapStruct.INSTANCE
                .fromProductModuleQueryDTO(productModuleQueryDTO);
        productModuleQuery.setOffsetIndex(productModuleQueryDTO.getOffsetIndex());
        int totalCount = productModuleMapper.queryProductModuleCount(productModuleQuery);
        Integer pageIndex = productModuleQueryDTO.getPageIndex();
        Integer pageSize = productModuleQueryDTO.getPageSize();
        if(0 == totalCount) {
            return new Page<>(pageIndex,pageSize,totalCount,new ArrayList<>());
        }
        List<ProductModuleDO> productModuleDOList =
                productModuleMapper.findProductModuleListByConditions(productModuleQuery);
        List<ProductModuleRespDTO> productModuleRespDTOList =
                ProductModuleMapStruct.INSTANCE.fromProductModuleDOList(productModuleDOList);
        return new Page<>(pageIndex,pageSize,totalCount,productModuleRespDTOList);
    }

    @Override
    public ProductModuleRespDTO getProductModuleDetail(BaseIdDTO baseIdDTO) {
        ProductModuleDO productModuleDO = ProductModuleMapStruct.INSTANCE.fromBaseIdDTO(baseIdDTO);
        ProductModuleDO productModuleDOInSql = productModuleMapper.getProductModuleDO(productModuleDO);
        if(null == productModuleDOInSql) {
            throw new BusinessException("该产品分类不存在");
        }
        ProductModuleRespDTO productModuleRespDTO = ProductModuleMapStruct.INSTANCE
                .fromProductModuleDO(productModuleDOInSql);
        return productModuleRespDTO;
    }


    private boolean checkProductCategoryModuleExist(ProductModuleDO productModuleDO) {
        return productModuleMapper.countModuleByProductCategory(productModuleDO) > 0;
    }
}
